#include <arpa/inet.h>
#include <sys/socket.h>
#include "common_impl.h"

/* variables globales */
#define BACKLOG 1024
#define PORT 33000
#define MAXBUF 1024

int readline(int fd, void *str, int max_len);
int sendline(int fd, const void *str, size_t maxlen);
void clean(char *buffer);

int main(int argc, char **argv) {
	int i;
	char* ip;
	char* machine_name;
	char** newargv2;
	struct sockaddr_in servaddr;
	int max;
	int sock_lanceur;
	int sock_dsm;
	fd_set readfs;
	char *buffer = NULL;
	pid_t pid;

	/* processus intermediaire pour "nettoyer" */
	/* la liste des arguments qu'on va passer */
	/* a la commande a executer vraiment */

	printf("salut\n");
	fflush(stdout);

	ip = argv[1];
	machine_name = argv[2];

	newargv2 = malloc(sizeof(char*) * (argc - 3));

	for (i = 0; i <= argc - 4; i++) {
		newargv2[i] = malloc(100 * sizeof(char));
		strcpy(newargv2[i], argv[i + 3]);
	}


	/* creation d'une socket pour se connecter au */
	/* au lanceur et envoyer/recevoir les infos */
	/* necessaires pour la phase dsm_init */

	/* creation de la socket d'ecoute */
	if ((sock_lanceur = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		ERROR_EXIT("socket");

	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(PORT);
	inet_aton("127.0.0.1", &servaddr.sin_addr);

	max = sock_lanceur;
	if (bind(sock_lanceur, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) {
		close(sock_lanceur);
		ERROR_EXIT("bind");
	}

	/* + ecoute effective */
	if (listen(sock_lanceur, BACKLOG) == -1)
		ERROR_EXIT("listen");

	/* Envoi du nom de machine au lanceur */

	if (sendline(sock_lanceur, machine_name, strlen(machine_name)) < 0)
		ERROR_EXIT("sendline");

	/* Envoi du pid au lanceur */
	pid = getpid();

	if (send(sock_lanceur, &pid, 4*sizeof(pid_t), 0) < 0)
		ERROR_EXIT("sendline");

while(1) {
	FD_ZERO(&readfs);

	FD_SET(STDIN_FILENO, &readfs);
	FD_SET(sock_lanceur, &readfs);

	if (select(sock_lanceur + 1, &readfs, NULL, NULL, NULL) == -1)
		ERROR_EXIT("select");

	memset(buffer, 0, MAXBUF);
		buffer = fgets(buffer, MAXBUF, stdin);
		clean(buffer);

}
/* Creation de la socket d'ecoute pour les */
/* connexions avec les autres processus dsm */

	/* Envoi du numero de port au lanceur */
	/* pour qu'il le propage à tous les autres */
	/* processus dsm */

	/* on execute la bonne commande */

	//exec truc
	return 0;
}



int readline(int fd, void *str, int max_len) {
	int n, rc;
	char c;
	char* buffer;

	buffer = str;
	for (n = 1; n < max_len; n++) {
		if ((rc = read(fd, &c, 1)) == 1) {
			*buffer++ = c;
			if (c == '\n')
				break;
		} else {
			if (rc == 0) {
				if (n == 1)
					return 0;
				else
					break;
			}
			if (rc == -1) {
				if (errno == EINTR)
					continue;
				else
					return -1;
			}
		}
	}
	*buffer = '\0';
	return n;
}

int sendline(int fd, const void *str, size_t maxlen) {
	int nleft; //caractères restant à écrire
	int nwritten; // caractères déjà écrits

	const char* buffer;

	buffer = str;
	nleft = maxlen;
	while (nleft > 0) {
		if ((nwritten = write(fd, buffer, nleft)) < 0) {
			if (errno == EINTR)
				nwritten = 0;
			else
				return -1;
		}
		nleft -= nwritten;
		buffer += nwritten;
	}
	return maxlen;
}

void clean(char *buffer) {
	char* p = NULL;
	p = strchr(buffer, '\n');
	if (p == NULL) {
		int c;
		while ((c = getchar()) != '\n' && c != EOF) {
		}
	}
}
